# To change this template, choose Tools | Templates
# and open the template in the editor.

__author__="Ronald"
__date__ ="$25-04-2010 06:38:12 PM$"

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.raw.GLUT import glutWireCone
from OpenGL.raw.GLUT import glutWireCube
from numpy import *
# import sys
# import math

windowId = -1
WIDTH = 800
HEIGHT = 600

PELVIS = 8
HIP = 0
KNEE = 0
ANGLE = 10

def kneeAdd():
    global KNEE
    if (KNEE < 90):
        KNEE = KNEE + 5

def kneeSubstract():
    global KNEE
    if (KNEE > 0):
        KNEE = KNEE - 5

def hipAdd():
    global HIP
    if (HIP < 40.5):
        HIP = HIP + 5

def hipSubstract():
    global HIP
    if (HIP > -40.5):
        HIP = HIP - 5

def angleAdd():
    global ANGLE
    if (ANGLE < 20):
        ANGLE = ANGLE + 5

def angleSubstract():
    global ANGLE
    if (ANGLE > 5):
        ANGLE = ANGLE - 5

# Configuramos OpenGL
def InitGL():

    glClearColor(0.0, 0.0, 0.0, 0.0)	# Color negro, sin transparencia

    glClear(GL_COLOR_BUFFER_BIT)
    glViewport(0, 0, WIDTH, HEIGHT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(-1, 1, -1, 1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def pierna():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f (1.0, 1.0, 1.0)

    glPushMatrix()
    #glTranslatef(0.0, -0.3, 0.0)
    glRotatef(90, 1.0, 0.0, 0.0)
    glutWireCone(0.5, 0.5, 8, 10)
    glPopMatrix()

    #glLoadIdentity()                # clear the matrix
    glPushMatrix()
    glRotatef(ANGLE, 0.0, 0.0, 1.0)
    glRotatef(HIP, 1.0, 0.0, 0.0)    # Rotacion pierna en eje x
    glTranslatef (0.2, -0.8, 0.0)    # Me muevo hacia abajo
    glScalef(1.0, 2.0, 1.0)          # Agrando en eje y para que sea rectangulo
    glutWireCube(0.4)                # Dibujo femur

    glColor3f (1.0, 1.0, 1.0)        # Color blanco
    glRotatef (KNEE, 1.0, 0.0, 0.0)  # Rotacion rodilla en eje x
    glTranslatef (0.0, -0.4, 0.0)    # Bajo para dibujar pantorrilla
    glColor3f (0.0, 0.0, 1.0)        # color azul
    #glScalef(0.7, 0.8, 0.7)
    glutWireCube(0.6)                # dibujo pantorrilla
    glPopMatrix()


    glPushMatrix()
    glColor3f (1.0, 1.0, 1.0)        # Color blanco
    glRotatef(-ANGLE, 0.0, 0.0, 1.0)
    glRotatef(HIP, 1.0, 0.0, 0.0)    # Rotacion pierna en eje x
    glTranslatef (-0.2, -0.8, 0.0)    # Me muevo hacia abajo
    glScalef(1.0, 2.0, 1.0)          # Agrando en eje y para que sea rectangulo
    glutWireCube(0.4)                # Dibujo femur

    glColor3f (1.0, 1.0, 1.0)        # Color blanco
    glRotatef (KNEE, 1.0, 0.0, 0.0)  # Rotacion rodilla en eje x
    glTranslatef (0.0, -0.4, 0.0)    # Bajo para dibujar pantorrilla
    glColor3f (0.0, 0.0, 1.0)        # color azul
    #glScalef(0.7, 0.8, 0.7)
    glutWireCube(0.6)                # dibujo pantorrilla


    glPopMatrix()
    glFlush();

    glutSwapBuffers()

def display():
    pierna()

def myinit():
    glShadeModel (GL_FLAT)

def myReshape(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(65.0, w/h, 1.0, 20.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslatef(0.0, 0.0, -5.0)

def keyPressed(*args):

    global HIP
    global KNEE

    key = args[0]

    # Si presion'o ESCAPE, salir de la aplicaci'on. Liberar recursos antes.
    if key == '\033':
	    glutDestroyWindow(windowId)
	    sys.exit()
    if key == 'w':
	    hipAdd()
    if key == 's':
	    hipSubstract()
    if key == 'd':
	    kneeAdd()
    if key == 'a':
	    kneeSubstract()
    if key == 'q':
	    angleAdd()
    if key == 'e':
	    angleSubstract()

def main():
    global windowId
    global WIDTH, HEIGHT

    # Configurar OpenGL
    glutInit(())

    # Mi modo de Display. Por ahora, no importa
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA )

    # Tamanio de la ventana.
    glutInitWindowSize(WIDTH, HEIGHT)

    # Donde queremos que se posicione la ventana al iniciar.
    glutInitWindowPosition(0, 0)
    glutCreateWindow("Proyecto Robot - Marcel_Ronald")

    # Defino la funci'on que se encargar'a de dibujar
    glutDisplayFunc(display)

    # La funci'on cuando el programa este Idle.
    # En un videoJuego, 'este ser'ia el lugar donde actualizo posiciones, calculo puntajes, etc.
    glutIdleFunc(display)

    # La funci'on a llamar cuando cambia el tamanio de la ventana.
    glutReshapeFunc (myReshape)

    # La funci'on que se encarga de recibir el input desde teclado
    glutKeyboardFunc (keyPressed)

    # Configuramos OpenGL para trabajar al tamanio deseado.
    myinit()

    # Loop infinito
    glutMainLoop()

main()